home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / t2b01 / t2b01s.lzh / TIM2BMP.S < prev    next >
Text File  |  1997-09-08  |  34KB  |  1,517 lines

  1. *********************************************************************************
  2. *    TIM to BMP converter                <TIM2BMP.X Ver0.01>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9. TIM_SU        equ    1000        *ファイル中に隠れているTIMの最大数
  10.  
  11. tim_grsize    equ    0
  12. tim_yoko    equ    8
  13. tim_tate    equ    10
  14.  
  15. file_header:
  16. f_type:        equ    0        *ファイル識別子 'BM'
  17. f_size:        equ    2        *ファイルのサイズ
  18. f_reserved1:    equ    6        *予備1
  19. f_reserved2:    equ    8        *予備2
  20. f_offbits:    equ    10        *ファイル先頭からイメージデータへのオフセット
  21.  
  22. WIN3_HED:
  23. win3_size:    equ    14        *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
  24. win3_width:    equ    18        *横サイズ
  25. win3_height:    equ    22        *縦サイズ
  26. win3_planes:    equ    26        *使用プレーン数
  27. win3_bitcount:    equ    28        *色数 (1:2色,4:16色,8:256色,24:16777216色)
  28. win3_comp:    equ    30        *圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
  29. win3_size_image    equ    34        *イメージデータのサイズ
  30. win3_xpels_pm:    equ    38        *X方向のディスプレイ分解能
  31. win3_ypels_pm:    equ    42        *Y方向のディスプレイ分解能
  32. win3_clr_used:    equ    46        *色変換テーブルの大きさ
  33. win3_clr_imp:    equ    50        *重要な色の数
  34.  
  35.     .text
  36.     .even
  37.  
  38. start:
  39.     lea.l    mysp(pc),sp        *スタックセット
  40.     lea.l    work(pc),a6
  41.  
  42.     lea.l    16(a0),a0        *余分なメモリ開放
  43.     suba.l    a0,a1
  44.     move.l    a1,-(sp)
  45.     move.l    a0,-(sp)
  46.     DOS    _SETBLOCK
  47.     addq.l    #8,sp
  48.  
  49.     bsr    cmdchk            *コマンドラインの解析
  50.     bsr    s_name_chk        *セーブファイル名のチェック
  51.     bsr    buf_get            *バッファ確保
  52.     bsr    name_get        *ファイル名を取得し処理する
  53.     bsr    buf_free        *バッファ開放
  54.     bsr    exit            *終了処理
  55.     DOS    _EXIT
  56.  
  57. *****************************************************************
  58. *    ファイル名を取得し、ファイルの読み込みを行う        *
  59. *****************************************************************
  60. name_get:
  61.     bsr    chkname            *ファイル名に対する前処理
  62.     bsr    chkext            *拡張子が省略されているかチェック
  63.  
  64.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  65.     pea.l    arg1(a6)        *
  66.     pea.l    filbuf(a6)        *
  67.     DOS    _FILES            *
  68.     lea.l    10(sp),sp        *
  69.  
  70. loop:
  71.     tst.l    d0            *ファイルは見つかったか?
  72.     bmi    done            * 見つからなければ処理完了
  73.  
  74.     bsr    setpath            *得られたファイル名を
  75.                     * フルパスに再構成する
  76.  
  77.     bsr    main            *メイン処理
  78.  
  79.     pea.l    filbuf(a6)        *つぎのファイルを検索する
  80.     DOS    _NFILES            *
  81.     addq.l    #4,sp            *
  82.  
  83.     bra    loop            *繰り返す
  84.  
  85. done:
  86.     rts
  87.  
  88. *****************************************************************
  89. *    files実行に先立ってファイル名に前処理を加える        *
  90. *****************************************************************
  91. chkname:
  92.     pea.l    nambuf(a6)        *ファイル名を展開する
  93.     pea.l    arg1(a6)        *
  94.     DOS    _NAMECK            *
  95.     addq.l    #8,sp            *
  96.  
  97.     tst.l    d0            *d0<0なら
  98.     bmi    name_er            * ファイル名の指定に誤りがある
  99.  
  100.     beq    nowild            *d0=0ならワイルドカード指定なし
  101.  
  102.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  103.     bne    wild            * ワイルドカード指定あり
  104.  
  105. noname:                    *ファイル名が指定されていない場合
  106.     lea.l    arg1(a6),a0        *バッファargに
  107.     lea.l    nambuf(a6),a1        * nameckで展開したパス名+'*.GLX'
  108.     bsr    strcpy            * を再構成する
  109.     lea.l    kome0(pc),a1        *
  110.     bsr    strcpy            *
  111.  
  112. wild:                    *ワイルドカードが指定された場合
  113.                     *何もしなくてよい
  114. cknam0:
  115.     rts
  116.  
  117. nowild:                    *ワイルドカードが指定されていない場合
  118.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  119.     pea.l    arg1(a6)        * 検索してみる
  120.     pea.l    filbuf(a6)        *
  121.     DOS    _FILES            *
  122.     lea.l    10(sp),sp        *
  123.     
  124.     tst.l    d0            *見つかったか?
  125.     bmi    cknam0            * 見つからなければファイルだろう
  126.  
  127.     lea.l    arg1(a6),a0        *バッファarg1に
  128.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.GLX'
  129.     bsr    strcat            * を再構成する
  130.  
  131.     bra    chkname            *nameckでファイル名を展開するために
  132.                     * サブルーチン先頭に戻る
  133.  
  134. *****************************************************************
  135. *    出力パス名をチェックする                *
  136. *****************************************************************
  137. s_name_chk:
  138.     lea.l    arg2(a6),a0        *出力パス名を指定したか?
  139.     tst.b    (a0)
  140.     beq    s_name_chk8        *してない
  141.  
  142.     pea.l    nambuf(a6)        *ファイル名を展開する
  143.     pea.l    arg2(a6)        *
  144.     DOS    _NAMECK            *
  145.     addq.l    #8,sp            *
  146.  
  147.     tst.l    d0            *d0<0なら
  148.     bmi    out_name_err        * パス名の指定に誤りがある
  149.  
  150.     beq    s_name_chk1        *d0=0ならワイルドカード指定なし
  151.  
  152.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  153.     bne    out_name_err        * ワイルドカード指定あり
  154.  
  155. s_name_chk1:
  156.     lea.l    arg2(a6),a0        *ドライブ名を指定しているか?
  157.     cmp.b    #':',1(a0)
  158.     bne    out_name_err        *ドライブ名の指定に誤りがある
  159.  
  160.     tst.b    2(a0)            *ドライブ名のみか
  161.     bne    s_name_chk2        *違う
  162.     addq.l    #2,a0
  163.     bra    s_name_chk9
  164.  
  165. s_name_chk2:
  166.     moveq.l    #0,d0            *セーブ先ドライブ番号を求める
  167.     move.b    (a0),d0
  168.     bsr    toupper
  169.     sub.b    #'A',d0
  170.     add.b    #1,d0
  171.  
  172.     lea.l    spathbuf(a6),a1        *セーブ先ドライブ名
  173.     move.b    (a0),(a1)+
  174.     move.b    #':',(a1)+
  175.     move.b    #'\',(a1)+
  176.  
  177.     move.l    a1,-(sp)        *セーブ先パスをセーブ
  178.     move.w    d0,-(sp)
  179.     DOS    _CURDIR
  180.     addq.l    #6,sp
  181.  
  182.     lea.l    cpathbuf(a6),a2        *カレントパスをセーブしておく
  183.     DOS    _CURDRV
  184.     add.b    #"A",d0
  185.     move.b    d0,(a2)+
  186.     move.b    #':',(a2)+
  187.     move.b    #'\',(a2)+
  188.  
  189.     move.l    a2,-(sp)
  190.     move.w    #0,-(sp)
  191.     DOS    _CURDIR
  192.     addq.l    #6,sp
  193.  
  194.     pea.l    arg2(a6)        *コマンドラインで指定されたパスへ
  195.     DOS    _CHDIR            * 移動してみる
  196.     addq.l    #4,sp
  197.  
  198.     tst.l    d0            *d0が0でなければ
  199.     bmi    out_name_err        * パス名の指定に誤りがある
  200.  
  201.     pea.l    spathbuf(a6)        *セーブ先パスを戻す
  202.     DOS    _CHDIR
  203.     addq.l    #4,sp
  204.  
  205.     pea.l    cpathbuf(a6)        *カレントパスに戻す
  206.     DOS    _CHDIR
  207.     addq.l    #4,sp
  208.  
  209.     lea.l    arg2(a6),a0        *
  210.     bsr    set_en            *パス名の最後に\マークをセット
  211.     bra    s_name_chk9
  212.  
  213. s_name_chk8:
  214.     lea.l    arg2(a6),a0
  215.  
  216. s_name_chk9:
  217.     move.l    a0,nameichi(a6)
  218.     rts
  219.  
  220. *****************************************************************
  221. *    パス名に¥マークを連結する                *
  222. *****************************************************************
  223. set_en:
  224.     tst.b    (a0)+            *(a0)は0か?
  225.     bne    set_en            *そうでなければ繰り返す
  226.     subq.l    #1,a0            *行きすぎたから1つ戻る
  227.  
  228.     cmp.b    #"\",-1(a0)        *一番最後の文字が¥か
  229.     beq    set_en_            * ¥ならばスキップ
  230.     move.b    #'\',(a0)+        * ¥をセット
  231. set_en_:
  232.     rts
  233.  
  234. *****************************************************************
  235. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  236. *        arg1以降に格納する                *
  237. *****************************************************************
  238. setpath:
  239.     lea.l    arg1(a6),a0        *a0=コピー先
  240.     lea.l    nambuf(a6),a1        *a1=nameckで展開したパス名
  241.     bsr    strcpy            *コピーする
  242.     lea.l    filbuf(a6),a1        *a1=files,nfilesで見付けたファイル名
  243.     lea.l    30(a1),a1
  244.     bsr    strcpy            *連結する
  245.     rts
  246.  
  247. *****************************************************************
  248. *    文字列の連結および複写                    *
  249. *    リターン時a0は文字列末の00Hを指す            *
  250. *****************************************************************
  251. strcat:
  252.     tst.b    (a0)+            *(a0)は0か?
  253.     bne    strcat            *そうでなければ繰り返す
  254.     subq.l    #1,a0            *行きすぎたから1つ戻る
  255. strcpy:
  256.     move.b    (a1)+,(a0)+        *1文字ずつ
  257.     bne    strcpy            *終了コードまでを転送する
  258.     subq.l    #1,a0            *a0は進み過ぎている
  259.                     *a0は文字列末の00Hを指す
  260.     rts
  261.  
  262. *****************************************************************
  263. *    拡張子を補う                        *
  264. *****************************************************************
  265. chkext:
  266.     lea.l    arg1(a6),a0        *ファイル名のアドレス
  267.     lea.l    dext(pc),a1        *拡張子のアドレス
  268. chkext0:
  269.     cmp.b    #".",(a0)        *拡張子があるか
  270.     beq    chkext2
  271.     tst.b    (a0)+            *(a0)は0か?
  272.     bne    chkext0            *そうでなければ繰り返す
  273.     subq.l    #1,a0            *行きすぎたから1つ戻る
  274. chkext1:
  275.     move.b    (a1)+,(a0)+        *1文字転送
  276.     bne    chkext1            *終了コードまで繰り返す
  277. chkext2:
  278.     rts
  279.  
  280. *****************************************************************
  281. *    コマンドラインのチェックを行う                *
  282. *****************************************************************
  283. cmdchk:
  284.     lea.l    arg1(a6),a0        *a0=引数切り出し領域
  285.     clr.b    256(a0)            *出力ファイル名をちょっと初期化
  286.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  287.  
  288. cmdchk0:
  289.     bsr    switch_chk        *スイッチのチェック
  290.  
  291.     tst.b    (a2)            *引数があるか?
  292.     beq    usage            *ないならファイル名が足りない
  293.     bsr    getarg            *ファイル名切り出し
  294.     lea.l    256(a0),a0        *a0=a0+256
  295.     bsr    switch_chk        *さらにスイッチのチェック
  296.     bsr    getarg            *ファイル名切り出し
  297.     bsr    switch_chk        *さらにスイッチのチェック
  298.     tst.b    (a2)            *引数があるか?
  299.     bne    usage            * あるなら引数が多い
  300. cmdchk1:
  301.     rts
  302.  
  303. *****************************************************************
  304. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  305. *    スイッチがあれば処理してしまう                *
  306. *****************************************************************
  307. switch_chk:
  308.     bsr    skipsp            *スペースをスキップする
  309.     tst.b    (a2)            *まだスイッチがあるか?
  310.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  311.  
  312.     cmpi.b    #'/',(a2)        *引数の先頭が
  313.     beq    switch_chk1        */,-であれば
  314.     cmpi.b    #'-',(a2)        *  スイッチ
  315.     beq    switch_chk1        *
  316.     bra    switch_chk2        *スイッチでないなら戻る
  317.  
  318. switch_chk1:
  319.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  320.     tst.b    (a2)            *スイッチがあるか?
  321.     beq    usage            * ないなら使用方表示
  322.     move.b    (a2)+,d0        *1文字取り出す
  323.     bsr    toupper            *大文字に変換しておく
  324.  
  325.     bra    usage            *無効なスイッチが指定された
  326.  
  327. switch_chk2:
  328.     rts
  329.  
  330. *****************************************************************
  331. *    ファイル名を切り出す                    *
  332. *****************************************************************
  333. getarg:
  334.     move.l    a0,-(sp)        *{レジスタ待避
  335. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  336.     beq    gtarg1            *
  337.     cmpi.b    #SPACE,(a2)        *2)スペースか
  338.     beq    gtarg1            *
  339.     cmpi.b    #TAB,(a2)        *3)タブか
  340.     beq    gtarg1            *
  341. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  342. *    beq    gtarg1            *
  343.     cmpi.b    #'/',(a2)        *5)スラッシュ
  344.     beq    gtarg1            *
  345.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  346.     bra    gtarg0            * 繰り返す
  347. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  348.     movea.l    (sp)+,a0        *}レジスタ復帰
  349.     rts
  350.  
  351. *****************************************************************
  352. *    スペース・TABをスキップする                *
  353. *****************************************************************
  354. skipsp0:
  355.     addq.l    #1,a2
  356. skipsp:
  357.     cmpi.b    #$20,(a2)
  358.     beq    skipsp0
  359.     cmpi.b    #$09,(a2)
  360.     beq    skipsp0
  361.     rts
  362.  
  363. *****************************************************************
  364. *    小文字→大文字変換ルーチン                *
  365. *****************************************************************
  366. toupper:
  367.     cmpi.b    #'a',d0
  368.     bcs    toupr0
  369.     cmpi.b    #'z'+1,d0
  370.     bcc    toupr0
  371.     subi.b    #$20,d0
  372. toupr0:
  373.     rts
  374.  
  375. *****************************************************************
  376. *    メイン処理                        *
  377. *****************************************************************
  378. main:
  379.     lea.l    arg1(a6),a0        *ファイル名セット
  380.     bsr    file_open        *ファイルオープン
  381.     bsr    file_size        *ファイルサイズを調べる
  382.     move.l    d6,fi_size(a6)
  383.  
  384.     cmp.l    buff_size(a6),d6    *メモリがあるか
  385.     bhi    main9
  386.  
  387.     bsr    kensaku_prt        *'検索中'表示
  388.     movea.l    buff_addr(a6),a5    *読み込む
  389.     bsr    file_read
  390.  
  391.     move.w    in_file(a6),-(sp)    *ファイルCLOSE
  392.     DOS    _CLOSE
  393.     addq.l    #2,sp
  394.  
  395.     move.l    buff_addr(a6),d0    *変換後アドレス
  396.     add.l    fi_size(a6),d0
  397.     move.l    d0,gr_addr2(a6)
  398.  
  399.     clr.w    file_cnt(a6)
  400.     clr.w    edaban(a6)
  401.     bsr    save_name_set        *書き込むファイル名作成
  402.     bsr    search            *サーチ
  403.     bsr    file_cnt_chk        *処理したファイル数のチェック
  404.     rts
  405.  
  406. main9:
  407.     move.w    in_file(a6),-(sp)    *メモリが全然足りない(;_;
  408.     DOS    _CLOSE
  409.     addq.l    #2,sp
  410.     bsr    no_buff
  411.     rts
  412.  
  413. *****************************************************************
  414. *    サーチ                            *
  415. *****************************************************************
  416. search:
  417.     movea.l    buff_addr(a6),a2    *検索開始アドレス
  418.  
  419.     movea.l    a2,a3            *検索終了アドレス(少し減らしておく)
  420.     adda.l    fi_size(a6),a3
  421.     lea.l    -20(a3),a3
  422.  
  423. search0:
  424.     sf    skip_flg(a6)
  425. search1:
  426.     cmp.l    a3,a2
  427.     bcc    search9
  428.     cmp.l    #$10000000,(a2)+
  429.     bne    search1
  430.  
  431.     move.l    (a2)+,d0        *色数チェック
  432.     cmp.l    #$0200_0000,d0        *32768colorのデータ
  433.     beq    search_32k
  434.     cmp.l    #$0900_0000,d0        *256colorのデータ
  435.     beq    search_256
  436.     cmp.l    #$0800_0000,d0        *16colorのデータ
  437.     bne    search1
  438.  
  439. search_16:
  440.     bsr    conv16
  441.     bra    search0
  442.  
  443. search_256:
  444.     bsr    conv256
  445.     bra    search0
  446.  
  447. search_32k:
  448.     bsr    conv32k
  449.     bra    search0
  450.  
  451. search9:
  452.     rts
  453.  
  454. *****************************************************************
  455. *    16色データの変換                    *
  456. *****************************************************************
  457. conv16:
  458.     subq.l    #8,a2
  459.  
  460.     move.l    8(a2),d0
  461.     bsr    i_to_m
  462.     addq.w    #8,d0
  463.     movea.l    a2,a0
  464.     adda.l    d0,a0
  465.  
  466.     move.l    tim_grsize(a0),d0    *TIMデータの大きさ求める
  467.     bsr    i_to_m
  468.     add.l    #52,d0
  469.     move.l    d0,tim_size(a6)
  470.  
  471.     move.w    tim_yoko(a0),d0        *横ドット数求める
  472.     rol.w    #8,d0            *横ドット数には4倍した値をセットする
  473.     add.w    d0,d0
  474.     add.w    d0,d0
  475.     move.w    d0,yoko(a6)
  476.  
  477.     move.w    tim_tate(a0),d0        *縦ドット数求める
  478.     rol.w    #8,d0
  479.     move.w    d0,tate(a6)
  480.  
  481.     lea.l    20(a2),a0        *パレットデータの先頭
  482.     move.l    a0,pal_addr(a6)
  483.     lea.l    64(a2),a0        *グラフィックデータの先頭
  484.     move.l    a0,gr_addr1(a6)
  485.  
  486.     bsr    setdec            *ファイル名作成
  487.     move.w    #4,iro(a6)
  488.     move.l    #4*16+54,head_size(a6)
  489.     bsr    line_byte_set
  490.     bsr    mem_chk            *メモリチェック
  491.     bsr    name_prt        *ファイル名とサイズ表示
  492.     tst.b    skip_flg(a6)
  493.     bne    conv16_
  494.  
  495.     bsr    head_create
  496.  
  497.     moveq.l    #16,d0            *パレット変換
  498.     bsr    pal_set
  499.     moveq.l    #16*4,d0        *パレットセーブ
  500.     bsr    pal_save
  501.  
  502.     bsr    conv16_0
  503.  
  504.     movea.l    gr_addr2(a6),a5
  505.     move.w    tate(a6),d6
  506.     mulu.w    line_byte(a6),d6
  507.     bsr    file_write
  508.     addq.w    #1,file_cnt(a6)
  509. conv16_:
  510.     move.w    out_file(a6),-(sp)
  511.     DOS    _CLOSE
  512.     addq.l    #2,sp
  513.     rts
  514.  
  515.  
  516. conv16_0:
  517.     move.l    gr_addr1(a6),a2
  518.     move.l    gr_addr2(a6),a1
  519.     move.w    tate(a6),d0
  520.     subq.w    #1,d0
  521.     mulu.w    line_byte(a6),d0
  522.     adda.l    d0,a1
  523.  
  524.     movea.w    line_byte(a6),a4
  525.     adda.l    a4,a4
  526.  
  527.     move.w    yoko(a6),d1        *半端分求める
  528.     addq.w    #1,d1
  529.     lsr.w    #1,d1
  530.     move.w    line_byte(a6),d0
  531.     sub.w    d1,d0
  532.     movea.w    d0,a5
  533.  
  534.     move.w    yoko(a6),d0        *横ループ
  535.     addq.w    #1,d0
  536.     lsr.w    #1,d0
  537.     move.w    tate(a6),d2        *縦ループ
  538.  
  539.     subq.w    #1,d0
  540.     subq.w    #1,d2
  541. conv16_1:
  542.     move.w    d0,d1
  543. conv16_2:
  544.     move.b    (a2)+,d3
  545.     ror.b    #4,d3
  546.     move.b    d3,(a1)+
  547.     dbra.w    d1,conv16_2
  548.  
  549.     move.w    a5,d1            *半端分クリア
  550.     beq    conv16_4
  551.     subq.w    #1,d1
  552. conv16_3:
  553.     clr.b    (a1)+
  554.     dbra.w    d1,conv16_3
  555.  
  556. conv16_4:
  557.     suba.l    a4,a1
  558.     dbra.w    d2,conv16_1
  559.     rts
  560.  
  561. *****************************************************************
  562. *    256色データの変換                    *
  563. *****************************************************************
  564. conv256:
  565.     subq.l    #8,a2
  566.  
  567.     move.l    8(a2),d0
  568.     bsr    i_to_m
  569.     addq.w    #8,d0
  570.     movea.l    a2,a0
  571.     adda.l    d0,a0
  572.  
  573.     move.l    tim_grsize(a0),d0    *TIMデータの大きさ求める
  574.     bsr    i_to_m
  575.     add.l    #532,d0
  576.     move.l    d0,tim_size(a6)
  577.  
  578.     move.w    tim_yoko(a0),d0        *横ドット数求める
  579.     rol.w    #8,d0
  580.     add.w    d0,d0            *横ドット数には2倍した値をセットする
  581.     move.w    d0,yoko(a6)
  582.  
  583.     move.w    tim_tate(a0),d0        *縦ドット数求める
  584.     rol.w    #8,d0
  585.     move.w    d0,tate(a6)
  586.  
  587.     lea.l    20(a2),a0        *パレットデータの先頭
  588.     move.l    a0,pal_addr(a6)
  589.     lea.l    544(a2),a0        *グラフィックデータの先頭
  590.     move.l    a0,gr_addr1(a6)
  591.  
  592.     bsr    setdec            *ファイル名作成
  593.     move.w    #8,iro(a6)
  594.     move.l    #4*256+54,head_size(a6)
  595.     bsr    line_byte_set
  596.     bsr    mem_chk            *メモリチェック
  597.     bsr    name_prt        *ファイル名とサイズ表示
  598.     tst.b    skip_flg(a6)
  599.     bne    conv256_
  600.  
  601.     bsr    head_create
  602.  
  603.     move.w    #256,d0            *パレット変換
  604.     bsr    pal_set
  605.     move.l    #256*4,d0        *パレットセーブ
  606.     bsr    pal_save
  607.  
  608.     bsr    conv256_0
  609.  
  610.     movea.l    gr_addr2(a6),a5
  611.     move.w    tate(a6),d6
  612.     mulu.w    line_byte(a6),d6
  613.     bsr    file_write
  614.     addq.w    #1,file_cnt(a6)
  615. conv256_:
  616.     move.w    out_file(a6),-(sp)
  617.     DOS    _CLOSE
  618.     addq.l    #2,sp
  619.     rts
  620.  
  621.  
  622. conv256_0:
  623.     move.l    gr_addr1(a6),a2
  624.     move.l    gr_addr2(a6),a1
  625.     move.w    tate(a6),d0
  626.     subq.w    #1,d0
  627.     mulu.w    line_byte(a6),d0
  628.     adda.l    d0,a1
  629.  
  630.     movea.w    line_byte(a6),a4
  631.     adda.l    a4,a4
  632.  
  633.     move.w    line_byte(a6),d0    *半端分求める
  634.     sub.w    yoko(a6),d0
  635.     movea.w    d0,a5
  636.  
  637.     move.w    yoko(a6),d0        *横ループ
  638.     move.w    tate(a6),d2        *縦ループ
  639.     subq.w    #1,d0
  640.     subq.w    #1,d2
  641. conv256_1:
  642.     move.w    d0,d1
  643. conv256_2:
  644.     move.b    (a2)+,(a1)+
  645.     dbra    d1,conv256_2
  646.  
  647.     move.w    a5,d1            *半端分クリア
  648.     beq    conv256_4
  649.     subq.w    #1,d1
  650. conv256_3:
  651.     clr.b    (a1)+
  652.     dbra.w    d1,conv256_3
  653.  
  654. conv256_4:
  655.     suba.l    a4,a1
  656.     dbra    d2,conv256_1
  657.     rts
  658.  
  659. *****************************************************************
  660. *    32k色データの変換                    *
  661. *****************************************************************
  662. conv32k:
  663.     subq.l    #8,a2
  664.  
  665.     lea.l    8(a2),a0        *先頭
  666.  
  667.     move.l    tim_grsize(a0),d0    *TIMデータの大きさ求める
  668.     bsr    i_to_m
  669.     addq.l    #8,d0
  670.     move.l    d0,tim_size(a6)
  671.  
  672.     move.w    tim_yoko(a0),d0        *横ドット数求める
  673.     rol.w    #8,d0
  674.     move.w    d0,yoko(a6)
  675.  
  676.     move.w    tim_tate(a0),d0        *縦ドット数求める
  677.     rol.w    #8,d0
  678.     move.w    d0,tate(a6)
  679.  
  680.     lea.l    20(a2),a0        *グラフィックデータの先頭
  681.     move.l    a0,gr_addr1(a6)
  682.  
  683.     bsr    setdec            *ファイル名作成
  684.     move.w    #24,iro(a6)
  685.     move.l    #0+54,head_size(a6)
  686.     bsr    line_byte_set
  687.     bsr    mem_chk            *メモリチェック
  688.     bsr    name_prt        *ファイル名とサイズ表示
  689.     tst.b    skip_flg(a6)
  690.     bne    conv32k_
  691.  
  692.     bsr    head_create
  693.     bsr    conv32k_0
  694.  
  695.     movea.l    gr_addr2(a6),a5
  696.     move.w    tate(a6),d6
  697.     mulu.w    line_byte(a6),d6
  698.     bsr    file_write
  699.     addq.w    #1,file_cnt(a6)
  700. conv32k_:
  701.     move.w    out_file(a6),-(sp)
  702.     DOS    _CLOSE
  703.     addq.l    #2,sp
  704.     rts
  705.  
  706.  
  707. conv32k_0:
  708.     movea.l    gr_addr1(a6),a2        *変換元
  709.     movea.l    gr_addr2(a6),a1        *変換先
  710.     move.w    tate(a6),d0
  711.     subq.w    #1,d0
  712.     mulu.w    line_byte(a6),d0
  713.     adda.l    d0,a1
  714.  
  715.     movea.w    line_byte(a6),a4
  716.     adda.l    a4,a4
  717.  
  718.     move.w    yoko(a6),d0        *半端分求める
  719.     move.w    d0,d1
  720.     add.w    d1,d1
  721.     add.w    d0,d1
  722.     move.w    line_byte(a6),d0
  723.     sub.w    d1,d0
  724.     movea.w    d0,a5
  725.  
  726.     move.w    tate(a6),d0        *縦ループ
  727.     subq.w    #1,d0
  728.  
  729.     move.w    #%00000000_01111100,d4    *マスクデータB
  730.     move.w    #%11100000_00000011,d5    *            G
  731.     move.w    #%00011111_00000000,d6    *            R
  732.     move.w    #%00000000_00000111,d7
  733.  
  734. conv32k_1:
  735.     move.w    yoko(a6),d1        *横ループ
  736.     subq.w    #1,d1
  737. conv32k_2:
  738.     move.w    (a2)+,d2
  739.  
  740.     move.w    d2,d3            *B
  741.     and.w    d4,d3
  742.     rol.w    #1,d3
  743.     beq    conv32k_3
  744.     or.w    d7,d3
  745. conv32k_3:
  746.     move.b    d3,(a1)+
  747.  
  748.     move.w    d2,d3            *G
  749.     and.w    d5,d3
  750.     rol.w    #6,d3
  751.     beq    conv32k_4
  752.     or.w    d7,d3
  753. conv32k_4:
  754.     move.b    d3,(a1)+
  755.  
  756.     move.w    d2,d3            *R
  757.     and.w    d6,d3
  758.     ror.w    #5,d3
  759.     beq    conv32k_5
  760.     or.w    d7,d3
  761. conv32k_5:
  762.     move.b    d3,(a1)+
  763.  
  764.     dbra.w    d1,conv32k_2
  765.  
  766.     move.w    a5,d1            *半端分クリア
  767.     beq    conv32k_7
  768.     subq.w    #1,d1
  769. conv32k_6:
  770.     clr.b    (a1)+
  771.     dbra.w    d1,conv32k_6
  772.  
  773. conv32k_7:
  774.     suba.l    a4,a1
  775.     dbra.w    d0,conv32k_1
  776.     rts
  777.  
  778. *****************************************************************
  779. *    パレット変換                        *
  780. *****************************************************************
  781. pal_set:
  782.     movem.l    d0-d7/a0-a1,-(sp)
  783.  
  784.     movea.l    pal_addr(a6),a0
  785.     movea.l    gr_addr2(a6),a1
  786.  
  787.     subq.w    #1,d0            *ループ数-1
  788.  
  789.     move.w    #%00000000_01111100,d4    *マスクデータ
  790.     move.w    #%11100000_00000011,d5
  791.     move.w    #%00011111_00000000,d6
  792.     move.w    #%00000000_00000111,d7
  793.  
  794. pal_set1:
  795.     move.w    (a0)+,d1        *B
  796.     move.w    d1,d2            *G
  797.     move.w    d1,d3            *R
  798.  
  799.     and.w    d4,d1            *B
  800.     rol.w    #1,d1
  801.     beq    pal_set2
  802.     or.w    d7,d1
  803.  
  804. pal_set2:
  805.     and.w    d5,d2            *G
  806.     rol.w    #6,d2
  807.     beq    pal_set3
  808.     or.w    d7,d2
  809.  
  810. pal_set3:
  811.     and.w    d6,d3            *R
  812.     ror.w    #5,d3
  813.     beq    pal_set4
  814.     or.w    d7,d3
  815.  
  816. pal_set4:
  817.     move.b    d1,(a1)+
  818.     move.b    d2,(a1)+
  819.     move.b    d3,(a1)+
  820.     clr.b    (a1)+
  821.  
  822.     dbra.w    d0,pal_set1
  823.  
  824.     movem.l    (sp)+,d0-d7/a0-a1
  825.     rts
  826.  
  827. *****************************************************************
  828. *    パレットセーブ                        *
  829. *****************************************************************
  830. pal_save:
  831.     movea.l    gr_addr2(a6),a5
  832.     move.l    d0,d6
  833.     bsr    file_write
  834.     rts
  835.  
  836. *****************************************************************
  837. *    1ラインのバイト数を求める                *
  838. *****************************************************************
  839. line_byte_set:
  840.     move.w    iro(a6),d0
  841.     cmp.w    #8,d0
  842.     bcs    lb_get4
  843.     beq    lb_get8
  844.     bhi    lb_get24
  845.  
  846. lb_get4:
  847.     move.w    yoko(a6),d0
  848.     addq.w    #7,d0
  849.     lsr.w    #1,d0
  850.     and.w    #$fffc,d0
  851.     move.w    d0,line_byte(a6)
  852.     bra    line_byte_set9
  853.  
  854. lb_get8:
  855.     move.w    yoko(a6),d0
  856.     addq.w    #3,d0
  857.     andi.w    #$fffc,d0
  858.     move.w    d0,line_byte(a6)
  859.     bra    line_byte_set9
  860.  
  861. lb_get24:
  862.     move.w    yoko(a6),d0
  863.     move.w    d0,d1
  864.     add.w    d1,d1
  865.     add.w    d1,d0
  866.     addq.w    #3,d0
  867.     and.w    #$fffc,d0
  868.     move.w    d0,line_byte(a6)
  869.  
  870. line_byte_set9:
  871.     rts
  872.  
  873. *****************************************************************
  874. *    メモリチェック                        *
  875. *****************************************************************
  876. mem_chk:
  877.     move.w    line_byte(a6),d0
  878.     mulu.w    tate(a6),d0
  879.     add.l    fi_size(a6),d0
  880.     cmp.l    buff_size(a6),d0
  881.     bls    mem_chk9
  882.     adda.l    tim_size(a6),a2        *変換できないぶん進める
  883.     st    skip_flg(a6)
  884. mem_chk9:
  885.     rts
  886.  
  887. *****************************************************************
  888. *    BMPヘッダの書き込み                    *
  889. *****************************************************************
  890. head_create:
  891.     bsr    head_set        *ヘッダデータの設定
  892.  
  893.     lea.l    arg2(a6),a0        *ヘッダ作成
  894.     bsr    file_create
  895.  
  896.     lea.l    head_buff(a6),a5    *ヘッダ書き込み
  897.     moveq.l    #54,d6
  898.     bsr    file_write
  899.     rts
  900.  
  901. *****************************************************************
  902. *    ヘッダデータの設定                    *
  903. *****************************************************************
  904. head_set:
  905.     lea.l    head_buff(a6),a0        *バッファの先頭
  906.  
  907.     move.w    #'BM',f_type(a0)        *ファイル識別子
  908.  
  909.     move.w    tate(a6),d0            *ファイルサイズ(TATExline_byte+ヘッダサイズ)
  910.     mulu.w    line_byte(a6),d0
  911.     move.l    d0,d1
  912.     add.l    head_size(a6),d0
  913.     bsr    i_to_m
  914.     move.l    d0,f_size(a0)
  915.  
  916.     clr.w    f_reserved1(a0)            *予備1
  917.     clr.w    f_reserved2(a0)            *予備2
  918.  
  919.     move.l    head_size(a6),d0            *ファイル先頭からイメージデータへのオフセット
  920.     bsr    i_to_m
  921.     move.l    d0,f_offbits(a0)
  922.  
  923.     move.l    #$28000000,win3_size(a0)    *ヘッダサイズ(12:OS/2 V1, 40:Win3, 64:OS/2 V2)
  924.  
  925.     move.w    yoko(a6),d0            *横サイズ
  926.     ext.l    d0
  927.     bsr    i_to_m
  928.     move.l    d0,win3_width(a0)
  929.  
  930.     move.w    tate(a6),d0            *縦サイズ
  931.     ext.l    d0
  932.     bsr    i_to_m
  933.     move.l    d0,win3_height(a0)
  934.  
  935.     move.w    #$0100,win3_planes(a0)        *使用プレーン数
  936.  
  937.     move.w    iro(a6),d0            *使用bit数(1:2色,4:16色,8:256色,24:16777216色)
  938.     ror.w    #8,d0
  939.     move.w    d0,win3_bitcount(a0)
  940.  
  941.     move.l    #0,win3_comp(a0)        *圧縮アルゴリズム (0:無圧縮,1:RLE8,2:RLE4)
  942.  
  943.     move.l    d1,d0                *イメージデータのサイズ
  944.     bsr    i_to_m
  945.     move.l    d0,win3_size_image(a0)
  946.  
  947. *    clr.l    win3_xpels_pm(a0)        *X方向のディスプレイ分解能
  948. *    clr.l    win3_ypels_pm(a0)        *Y方向のディスプレイ分解能
  949.     move.l    #$130B0000,win3_xpels_pm(a0)    *X方向のディスプレイ分解能
  950.     move.l    #$130B0000,win3_ypels_pm(a0)    *Y方向のディスプレイ分解能
  951.  
  952.     clr.l    win3_clr_used(a0)        *色変換テーブルの大きさ
  953.     clr.l    win3_clr_imp(a0)        *重要な色の数
  954.     rts
  955.  
  956. i_to_m:
  957.     ror.w    #8,d0
  958.     swap.w    d0
  959.     ror.w    #8,d0
  960.     rts
  961.  
  962. *****************************************************************
  963. *    セーブするファイル名を作る                *
  964. *****************************************************************
  965. save_name_set:
  966.     movem.l    d0/a0-a1,-(sp)
  967.  
  968.     movea.l    nameichi(a6),a0
  969.     lea.l    filbuf(a6),a1
  970.     lea.l    30(a1),a1
  971.     bsr    strcpy
  972.  
  973.     movea.l    nameichi(a6),a0
  974.     moveq.l    #15-1,d0
  975. sn_get0:
  976.     cmp.b    #".",(a0)+
  977.     beq    sn_get1
  978.     dbra.w    d0,sn_get0
  979.     addq.l    #1,a0
  980. sn_get1:
  981.     addq.l    #2,a0
  982.     move.l    a0,edaichi(a6)
  983.     move.b    #"0",-3(a0)
  984.     move.b    #"0",-2(a0)
  985.     move.b    #"0",-1(a0)
  986.     move.b    #".",(a0)
  987.     move.b    #"B",1(a0)
  988.     move.b    #"M",2(a0)
  989.     move.b    #"P",3(a0)
  990.     move.b    #0,4(a0)
  991.     movem.l    (sp)+,d0/a0-a1
  992.     rts
  993.  
  994. *****************************************************************
  995. *    ファイル名の枝番をセットする                *
  996. *****************************************************************
  997. setdec:
  998.     addq.w    #1,edaban(a6)
  999.     move.w    edaban(a6),d0        *枝番を転送
  1000.     andi.l    #$0000FFFF,d0        *上位ワードをクリア
  1001.     movea.l    edaichi(a6),a0        *転送位置
  1002.  
  1003. setdec0:
  1004.     divu.w    #10,d0            *d0.lを10で割る
  1005.     swap.w    d0            *上位ワードと下位ワードを交換
  1006.     addi.w    #'0',d0            *0~9 → '0'~'9'
  1007.     move.b    d0,-(a0)        *1桁格納
  1008.     clr.w    d0            *次の除算に備える
  1009.     swap.w    d0            *上位ワードと下位ワードを交換
  1010.     bne    setdec0
  1011.     rts
  1012.  
  1013. *****************************************************************
  1014. *    ファイルのOPENを行う                *
  1015. *****************************************************************
  1016. file_open:
  1017.     move.w    #0,-(sp)        *ファイルopen
  1018.     move.l    a0,-(sp)
  1019.     DOS    _OPEN
  1020.     addq.l    #6,sp
  1021.     tst.l    d0
  1022.     bmi    open_err
  1023.     move.w    d0,in_file(a6)
  1024.     rts
  1025.  
  1026. *****************************************************************
  1027. *    ファイルのサイズを求める(d6に返す)            *
  1028. *****************************************************************
  1029. file_size:
  1030.     move.w    #2,-(sp)
  1031.     move.l    #0,-(sp)
  1032.     move.w    in_file(a6),-(sp)
  1033.     DOS    _SEEK
  1034.     addq.l    #8,sp
  1035.     tst.l    d0            *OK?
  1036.     bmi    read_err
  1037.  
  1038.     move.l    d0,d6
  1039.  
  1040.     move.w    #0,-(sp)
  1041.     move.l    #0,-(sp)
  1042.     move.w    in_file(a6),-(sp)
  1043.     DOS    _SEEK
  1044.     addq.l    #8,sp
  1045.     tst.l    d0            *OK?
  1046.     bmi    read_err
  1047.     rts
  1048.  
  1049. *****************************************************************
  1050. *    ディスクからデータの読み込みを行う            *
  1051. *****************************************************************
  1052. file_read:
  1053.     move.l    d6,-(sp)        *データサイズ
  1054.     move.l    a5,-(sp)        *バッファアドレス
  1055.     move.w    in_file(a6),-(sp)
  1056.     DOS    _READ
  1057.     lea    10(sp),sp
  1058.     tst.l    d0
  1059.     bmi    read_err
  1060.     cmp.l    d6,d0
  1061.     bne    read_err
  1062.     rts
  1063.  
  1064. *****************************************************************
  1065. *    ファイル作成                        *
  1066. *****************************************************************
  1067. file_create:
  1068.     move.w    #$20,-(sp)        *ファイルCREATE
  1069.     move.l    a0,-(sp)
  1070.     DOS    _CREATE
  1071.     addq.l    #6,sp
  1072.  
  1073.     tst.l    d0
  1074.     bmi    create_err
  1075.     move.w    d0,out_file(a6)
  1076.     rts
  1077.  
  1078. *****************************************************************
  1079. *    ディスクに書き込む                    *
  1080. *****************************************************************
  1081. file_write:
  1082.     move.l    d6,-(sp)        *データサイズ
  1083.     move.l    a5,-(sp)        *バッファアドレス
  1084.     move.w    out_file(a6),-(sp)
  1085.     DOS    _WRITE
  1086.     lea.l    10(sp),sp
  1087.     tst.l    d0
  1088.     bmi    write_err
  1089.     cmp.l    d6,d0
  1090.     bne    write_err
  1091.     rts
  1092.  
  1093. *****************************************************************
  1094. *    バッファ確保                        *
  1095. *****************************************************************
  1096. buf_get:
  1097.     pea.l    -1.w            *確保出来る最大サイズを取得
  1098.     DOS    _MALLOC
  1099.     addq.l    #4,sp
  1100.     andi.l    #$00ffffff,d0
  1101.     move.l    d0,d1
  1102.     move.l    d0,-(sp)
  1103.     DOS    _MALLOC
  1104.     addq.l    #4,sp
  1105.     tst.l    d0
  1106.     bmi    no_buff
  1107.  
  1108.     move.l    d0,buff_addr(a6)    *バッファアドレス
  1109.     move.l    d1,buff_size(a6)    *バッファサイズ
  1110.     rts
  1111.  
  1112. *****************************************************************
  1113. *    バッファ開放                        *
  1114. *****************************************************************
  1115. buf_free:
  1116.     pea.l    buff_addr(a6)        *バッファ開放
  1117.     DOS    _MFREE
  1118.     addq.l    #4,sp
  1119.     rts
  1120.  
  1121. *****************************************************************
  1122. *    処理したファイル数をチェックする            *
  1123. *****************************************************************
  1124. file_cnt_chk:
  1125.     tst.w    file_cnt(a6)        *処理したファイルは0個か
  1126.     bne    file_cnt_chk1        *違う
  1127.     lea.l    no_file_mes(pc),a0
  1128.     bsr    mesput
  1129. file_cnt_chk1:
  1130.     rts
  1131.  
  1132. *****************************************************************
  1133. *    '検索中'を表示                        *
  1134. *****************************************************************
  1135. kensaku_prt:
  1136.     lea.l    crlf_mes(pc),a0
  1137.     bsr    mesput
  1138.     lea.l    filbuf(a6),a0
  1139.     lea.l    30(a0),a0
  1140.     bsr    mesput
  1141.     lea.l    kensaku_mes(pc),a0
  1142.     bsr    mesput
  1143.     rts
  1144.  
  1145. *****************************************************************
  1146. *    セーブファイル名&サイズを表示する            *
  1147. *****************************************************************
  1148. name_prt:
  1149.     movem.l    d0/a0-a1,-(sp)
  1150.  
  1151.     lea.l    prt_buff(a6),a0        *表示バッファ初期化
  1152.     moveq.l    #96-1,d0
  1153. name_prt1:
  1154.     move.b    #SPACE,(a0)+
  1155.     dbra.w    d0,name_prt1
  1156.     clr.b    (a0)+
  1157.  
  1158.     lea.l    prt_buff(a6),a0        *表示バッファ
  1159.  
  1160.     movea.l    nameichi(a6),a1        *ファイル名
  1161.     bsr    strcpy
  1162.     move.b    #SPACE,(a0)
  1163.  
  1164.     lea.l    prt_buff(a6),a0        *位置合わせ
  1165.     lea.l    22(a0),a0
  1166.  
  1167.     move.b    #"(",(a0)+        *画像サイズ
  1168.     move.w    yoko(a6),d0
  1169.     bsr    dec_set
  1170.     move.b    #SPACE,(a0)+
  1171.     move.b    #"*",(a0)+
  1172.     move.w    tate(a6),d0
  1173.     bsr    dec_set
  1174.     move.b    #")",(a0)+
  1175.  
  1176.     move.w    iro(a6),d0        *bit数
  1177.     bsr    dec_set
  1178.     lea.l    bit_mes(pc),a1
  1179.     bsr    strcpy
  1180.  
  1181.     move.w    tate(a6),d0        *バイト数
  1182.     mulu.w    line_byte(a6),d0
  1183.     add.l    head_size(a6),d0
  1184.     bsr    dec_set2
  1185.     lea.l    byte_mes(pc),a1
  1186.     bsr    strcpy
  1187.  
  1188.     tst.b    skip_flg(a6)        *メモリが足りない時
  1189.     beq    name_prt2
  1190.  
  1191.     lea.l    no_buff_mes(pc),a1
  1192.     bsr    strcpy
  1193.  
  1194. name_prt2:
  1195.     lea.l    crlf_mes(pc),a1
  1196.     bsr    strcpy
  1197.  
  1198.     lea.l    prt_buff(a6),a0
  1199.     bsr    mesput
  1200.     movem.l    (sp)+,d0/a0-a1
  1201.     rts
  1202.  
  1203. dec_set:
  1204.     move.l    a0,-(sp)
  1205.     ext.l    d0
  1206.     lea.l    dec_buf(a6),a0
  1207.     bsr    bin2dec
  1208.     bsr    zero_keshi
  1209.     move.l    (sp)+,a0
  1210.     lea.l    dec_buf(a6),a1
  1211.     addq.l    #6,a1
  1212.     bsr    strcpy
  1213.     rts
  1214.  
  1215. dec_set2:
  1216.     move.l    a0,-(sp)
  1217.     lea.l    dec_buf(a6),a0
  1218.     bsr    bin2dec
  1219.     bsr    zero_keshi
  1220.     move.l    (sp)+,a0
  1221.     lea.l    dec_buf(a6),a1
  1222.     bsr    strcpy
  1223.     rts
  1224.  
  1225. *****************************************************************
  1226. *    2進=>10進                        *
  1227. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  1228. *****************************************************************
  1229. bin2dec:
  1230.     movem.l    d0-d3/a0-a1,-(sp)
  1231.     moveq.l    #10-1,d1
  1232.     lea.l    exp_tbl(pc),a1
  1233. bin2dec0:
  1234.     clr.b    d2
  1235.     move.l    (a1)+,d3
  1236. bin2dec1:
  1237.     or    d3,d3
  1238.     sub.l    d3,d0
  1239.     bcs    bin2dec2
  1240.     addq.b    #1,d2
  1241.     bra    bin2dec1
  1242. bin2dec2:
  1243.     add.l    d3,d0
  1244.     add.b    #'0',d2
  1245.     move.b    d2,(a0)+
  1246.     dbra    d1,bin2dec0
  1247.     movem.l    (sp)+,d0-d3/a0-a1
  1248.     rts
  1249.  
  1250. exp_tbl:
  1251.     .dc.l    1000000000
  1252.     .dc.l    100000000
  1253.     .dc.l    10000000
  1254.     .dc.l    1000000
  1255.     .dc.l    100000
  1256.     .dc.l    10000
  1257.     .dc.l    1000
  1258.     .dc.l    100
  1259.     .dc.l    10
  1260.     .dc.l    1
  1261.  
  1262. *****************************************************************
  1263. *    ファイルサイズの頭にある'0'を消す            *
  1264. *****************************************************************
  1265. zero_keshi:
  1266.     lea.l    dec_buf(a6),a0
  1267.     moveq.l    #9-1,d0
  1268. zero_keshi0:
  1269.     cmp.b    #'0',(a0)
  1270.     bne    zero_keshi9
  1271.     move.b    #SPACE,(a0)+
  1272.     dbra.w    d0,zero_keshi0
  1273. zero_keshi9:
  1274.     rts
  1275.  
  1276. *****************************************************************
  1277. *    ファイル名エラー                    *
  1278. *****************************************************************
  1279. name_er:
  1280.     lea.l    in_mes(pc),a0
  1281.     bsr    mesput
  1282.     lea.l    name_er_mes(pc),a0
  1283.     bsr    mesput
  1284.     bra    exit2
  1285.  
  1286. *****************************************************************
  1287. *    メモリが足りない                    *
  1288. *****************************************************************
  1289. no_buff:
  1290.     lea.l    arg1(a6),a0
  1291.     bsr    mesput
  1292.     lea.l    no_buff_mes(pc),a0
  1293.     bsr    mesput
  1294.     lea.l    crlf_mes(pc),a0
  1295.     bsr    mesput
  1296.     bra    exit2
  1297.  
  1298. *****************************************************************
  1299. *    ファイルが見付からない                    *
  1300. *****************************************************************
  1301. open_err:
  1302.     lea.l    arg1(a6),a0
  1303.     bsr    mesput
  1304.     lea.l    open_er_mes(pc),a0
  1305.     bsr    mesput
  1306.     bra    exit2
  1307.  
  1308. *****************************************************************
  1309. *    読み込みエラー                        *
  1310. *****************************************************************
  1311. read_err:
  1312.     lea.l    arg1(a6),a0
  1313.     bsr    mesput
  1314.     lea.l    read_er_mes(pc),a0
  1315.     bsr    mesput
  1316.     bra    exit2
  1317.  
  1318. *****************************************************************
  1319. *    出力パス名エラー                    *
  1320. *****************************************************************
  1321. out_name_err:
  1322.     lea.l    out_mes(pc),a0
  1323.     bsr    mesput
  1324.     lea.l    name_er_mes(pc),a0
  1325.     bsr    mesput
  1326.     bra    exit2
  1327.  
  1328. *****************************************************************
  1329. *    ファイル作成エラー                    *
  1330. *****************************************************************
  1331. create_err:
  1332.     lea.l    arg2(a6),a0
  1333.     bsr    mesput
  1334.     lea.l    create_er_mes(pc),a0
  1335.     bsr    mesput
  1336.     bra    exit2
  1337.  
  1338. *****************************************************************
  1339. *    ファイル書き込みエラー                    *
  1340. *****************************************************************
  1341. write_err:
  1342.     lea.l    arg2(a6),a0
  1343.     bsr    mesput
  1344.     lea.l    write_er_mes(pc),a0
  1345.     bsr    mesput
  1346.     bra    exit2
  1347.  
  1348. *****************************************************************
  1349. *    使用方表示                        *
  1350. *****************************************************************
  1351. usage:
  1352.     lea.l    usage_mes(pc),a0
  1353.     bsr    mesput
  1354.     bra    exit2
  1355.  
  1356. *****************************************************************
  1357. *    メッセージ表示                        *
  1358. *****************************************************************
  1359. mesput:
  1360. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  1361.     move.w    #STDOUT,-(sp)        *標準出力へ
  1362.     move.l    a0,-(sp)        *メッセージを
  1363.     DOS    _FPUTS            *出力する
  1364.     addq.l    #6,sp            *スタック補正
  1365.     rts
  1366.  
  1367. *****************************************************************
  1368. *    終了処理                        *
  1369. *****************************************************************
  1370. exit:
  1371.     IOCS    _MS_INIT        *キーバッファクリア
  1372.     moveq.l    #-1,d1
  1373.     IOCS    _SKEY_MOD
  1374.     move.w    #-1,-(sp)
  1375.     DOS    _KFLUSH
  1376.     addq.l    #2,sp
  1377.     rts
  1378.  
  1379. *****************************************************************
  1380. *    エラー処理2                        *
  1381. *****************************************************************
  1382. exit2:
  1383.     bsr    exit
  1384.     move.w    #1,-(sp)        *終了コード1を持って
  1385.     DOS    _EXIT2            * エラー終了
  1386.  
  1387. *****************************************************************
  1388. *    データエリア                        *
  1389. *****************************************************************
  1390.     .data
  1391.     .even
  1392. usage_mes:
  1393.     .dc.b    'TIM to BMP converter V0.01 by A.MUKAWA',CR,LF
  1394.     .dc.b    '機能:PSベタのTIMファイルを Win標準のBMPファイルにコンバートします',CR,LF
  1395.     .dc.b    '用法:TIM2BMP ファイル名 [セーブ先パス]',CR,LF
  1396.     .dc.b    CR,LF
  1397.     .dc.b    'セーブされるファイル名は、元のファイル名(最大15文字)の後ろに',CR,LF
  1398.     .dc.b    '3桁の数字が付いた、拡張子が"BMP"のファイル名になります。',CR,LF
  1399.     .dc.b    '8文字以上になる事もあるので注意して下さい。',CR,LF
  1400.     .dc.b    0
  1401.  
  1402. in_mes:
  1403.     .dc.b    '入力ファイル',0
  1404. out_mes:
  1405.     .dc.b    '出力先パス',0
  1406. name_er_mes:
  1407.     .dc.b    '名の指定に間違いがあります!',CR,LF,0
  1408. open_er_mes:
  1409.     .dc.b    ' が見つかりません!',CR,LF,0
  1410. read_er_mes:
  1411.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  1412. create_er_mes:
  1413.     .dc.b    ' が作れません!',CR,LF,0
  1414. write_er_mes:
  1415.     .dc.b    ' の書き込みエラーが発生しました!',CR,LF,0
  1416. no_file_mes:
  1417.     .dc.b    'TIMファイルが見つかりませんでした!',CR,LF,0
  1418. henkan_mes:
  1419.     .dc.b    ' 変換中',0
  1420. syuryo_mes:
  1421.     .dc.b    ' 終了!',0
  1422. kensaku_mes:
  1423.     .dc.b    ' を検索中',CR,LF,0
  1424. no_buff_mes:
  1425.     .dc.b    ' の変換に必要なメモリがありません!',0
  1426. byte_mes:
  1427.     .dc.b    'byte',0
  1428. bit_mes:
  1429.     .dc.b    'bit',0
  1430. crlf_mes:
  1431.     .dc.b    CR,LF,0
  1432. func_off_mes:
  1433.     .dc.b    $1b,$5b,$3e,$31,$68,0
  1434.  
  1435. dext:
  1436.     .dc.b    '.TIM',0        *補う拡張子
  1437. komekome:
  1438.     .dc.b    '\'
  1439. kome0:
  1440.     .dc.b    '*.TIM',0
  1441.  
  1442. *****************************************************************
  1443. *    ワークエリア                        *
  1444. *****************************************************************
  1445.  
  1446.     .offset    0
  1447. filbuf:
  1448.     .ds.b    53            *ファイル情報格納バッファ
  1449. nambuf:
  1450.     .ds.b    92            *ファイル名展開用バッファ
  1451. arg1:
  1452.     .ds.b    256            *入力ファイル名バッファ
  1453. arg2:
  1454.     .ds.b    256            *出力ファイル名バッファ
  1455. cpathbuf
  1456.     .ds.b    65            *カレントパス名バッファ
  1457. spathbuf
  1458.     .ds.b    65            *セーブ先パス名バッファ
  1459.     .even
  1460. head_buff:
  1461.     .ds.b    54            *BMPヘッダバッファ
  1462. head_size:
  1463.     .ds.l    1            *ヘッダサイズ
  1464. buff_addr:
  1465.     .ds.l    1            *画像読み込みバッファアドレス
  1466. buff_size:
  1467.     .ds.l    1            *画像読み込みバッファサイズ
  1468. pal_addr:
  1469.     .ds.l    1            *パレットアドレス
  1470. gr_addr1:
  1471.     .ds.l    1            *変換前画像アドレス
  1472. gr_addr2:
  1473.     .ds.l    1            *変換後画像アドレス
  1474. fi_size:
  1475.     .ds.l    1            *ファイルサイズ
  1476. tim_size:
  1477.     .ds.l    1            *TIMサイズ
  1478. iro:
  1479.     .ds.w    1            *使用bit数
  1480. yoko:
  1481.     .ds.w    1            *画像の横(X)サイズ
  1482. tate:
  1483.     .ds.w    1            *画像の縦(Y)サイズ
  1484. line_byte:
  1485.     .ds.w    1            *1ラインのバイト数
  1486. line_cnt:
  1487.     .ds.w    1
  1488. file_cnt:
  1489.     .ds.w    1
  1490. nameichi:
  1491.     .ds.l    1
  1492. edaichi:
  1493.     .ds.l    1
  1494. edaban:
  1495.     .ds.w    1
  1496. in_file:
  1497.     .ds.w    1
  1498. out_file:
  1499.     .ds.w    1
  1500. dec_buf:
  1501.     .ds.b    10+1
  1502. prt_buff:
  1503.     .ds.b    96+1
  1504. skip_flg:
  1505.     .ds.b    1
  1506.     .even
  1507. WORK_SIZE:
  1508.  
  1509.     .bss
  1510.     .even
  1511. work:
  1512.     .ds.b    WORK_SIZE
  1513. my_stack:
  1514.     .ds.l    1024
  1515. mysp:
  1516.     .end    start
  1517.